#include "cmdFunc.h"
#include "log.h"
// 删除文件
int remove_file(const char *file_path) {
    if (remove(file_path) == 0) {
        printf("File %s deleted successfully.\n", file_path);
        return 0;
    } else {
        perror("Error deleting file");
        return -1;
    }
}

// 递归删除目录及其内容
int remove_dir(const char *dir_path) {
    DIR *d = opendir(dir_path);
    struct dirent *entry;
    struct stat statbuf;

    if (!d) {
        perror("Error opening directory");
        return -1;
    }

    while ((entry = readdir(d)) != NULL) {
        if (strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")) {
            char entry_path[PATH_MAX];
            snprintf(entry_path, PATH_MAX, "%s/%s", dir_path, entry->d_name);

            if (lstat(entry_path, &statbuf) == -1) {
                perror("Error getting file status");
                return -1;
            }

            if (S_ISDIR(statbuf.st_mode)) {
                if (remove_dir(entry_path) == -1) {
                    return -1;
                }
            } else {
                if (remove_file(entry_path) == -1) {
                    return -1;
                }
            }
        }
    }

    closedir(d);

    if (rmdir(dir_path) == 0) {
        printf("Directory %s deleted successfully.\n", dir_path);
        return 0;
    } else {
        perror("Error deleting directory");
        return -1;
    }
}




// rm指令,cwd_t获取cwd,cmd_t获取指令及参数
int rmCmd(int netfd, const cwd_t *pcwd, const cmd_t *pcmd){
    //目的：得到删除用的真正地址rm_realpath，判断合法性（会破坏cwd的结构就不合法）决定是否删除
    //得到删除用的真正地址rm_realpath
    char rm_realpath[PATH_MAX]={0};
    realPath(pcwd, pcmd->argv1, rm_realpath);

    //判断合法性
    //是文件，不存在合法与否直接删除，如果文件不存在remove会报错，不用我们处理
    //是目录，也不存在合法与否

    //判断是删文件还是目录，如果是目录需要循环删除
    struct stat statbuf;
    int ret= lstat(rm_realpath,&statbuf);
    ERROR_CHECK(ret,-1,"lstat");
    if(S_ISDIR(statbuf.st_mode)){//是目录返回非0，是文件返回0
        //说明是目录
        int ret= remove_dir(rm_realpath);
        if(ret==-1){
            //给用户发删除失败的消息
            char errorMsg[]="e:delete failed!";
            // 发送错误信息, 如果填入NULL, 发送一个'e'报错信号
            // 如果填入字符串, 将其作为报错信息发送给客户端
            errorSend(netfd, errorMsg);
        }
        //给用户发删除成功的消息
        // 发送成功信息'o'
        successSend(netfd);



    }
    //说明是文件
    int ret1= remove_file(rm_realpath);
    if(ret1==-1){
        //给用户发删除失败的消息
        char errorMsg[]="e:delete failed!";
        // 发送错误信息, 如果填入NULL, 发送一个'e'报错信号
        // 如果填入字符串, 将其作为报错信息发送给客户端
        errorSend(netfd, errorMsg);
    }
    //给用户发删除成功的消息
    // 发送成功信息'o'
    successSend(netfd);
    return 0;
}


// mkdir指令,cwd_t获取cwd,cmd_t获取指令及参数
int mkdirCmd(int netfd, const cwd_t *pcwd, const cmd_t *pcmd){
    if(pcmd->argv1[0]=='/'){//说明指令后面参数用的绝对地址；创建目录的路径需要拼接：rootDir+用户名（栈底元素）+pcmd->argv1;
        char mkdir_realPath[PATH_MAX];
        sprintf(mkdir_realPath,"%s%s%s",rootDir,pcwd->bottom->data,pcmd->argv1);
        int ret= mkdir(mkdir_realPath,0777);
        if(ret==-1){
            //给用户发创建失败的消息
            char errorMsg[]="e:mkdir failed!";
            // 发送错误信息, 如果填入NULL, 发送一个'e'报错信号
            // 如果填入字符串, 将其作为报错信息发送给客户端
            errorSend(netfd, errorMsg);
        }
        //给用户发创建成功的消息
        successSend(netfd);
    }else{
        //说明指令后面参数用的绝对地址；创建目录的路径需要拼接：rootDi+cwd+pcmd->argv1;
        char mkdir_realPath[PATH_MAX];
        //获取cwd
        char pwdstr[1024];
        getPath(pcwd,pwdstr);
        sprintf(mkdir_realPath,"%s%s%s",rootDir,pwdstr,pcmd->argv1);
        int ret1= mkdir(mkdir_realPath,0777);
        if(ret1==-1){
            //给用户发创建失败的消息
            //给用户发创建失败的消息
            char errorMsg[]="e:mkdir failed!";
            // 发送错误信息, 如果填入NULL, 发送一个'e'报错信号
            // 如果填入字符串, 将其作为报错信息发送给客户端
            errorSend(netfd, errorMsg);

        }
        //给用户发创建成功的消息
        successSend(netfd);
    }
    return 0;
}
